package com.taoyibao.hongcanting.utils;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.content.FileProvider;

import com.taoyibao.hongcanting.constant.CodeConstant;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author TangAnna
 * @description: 相机拍照工具类
 * @date :${DATA} 11:28
 */
public class CameraUtils {
    private static final String TAG = "CameraUtils";
    private Context mContext;

    /**
     * 图片文件夹目录
     */
    public static final String DIRECTORY_PICTURE = FileUtils.TEMP;
    private File mOriginalFile;//原始文件
    private File mCropFile;//裁剪之后的文件

    private Uri mCropUri;//裁剪之后的Uri


    public CameraUtils(Context context) {
        mContext = context;
    }

    /**
     * 相机拍照
     *
     * @param requestCode 请求码
     * @param directory   问价存放的目录（本类中上面写好）
     */
    public void openCamera(int requestCode, String directory) {
        mOriginalFile = new File(Environment.getExternalStorageDirectory(), directory + System.currentTimeMillis() + ".jpg");
        //判断文件是否存在
        if (!mOriginalFile.getParentFile().exists()) {
            mOriginalFile.getParentFile().mkdirs();
        }
        // 通过FileProvider创建一个content类型的Uri
        Uri uri = FileProvider.getUriForFile(mContext, CodeConstant.PROVIDER_STR, mOriginalFile);
        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
        intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); //设置Action为拍照
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); //将拍取的照片保存到指定URI
        ((Activity) mContext).startActivityForResult(intent, requestCode);
    }

    /**
     * 打开相册
     */
    public void openAlbum(int requestCode) {
        Intent albumIntent = new Intent(Intent.ACTION_PICK);
        albumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
        ((Activity) mContext).startActivityForResult(albumIntent, requestCode);
    }

    /**
     * 裁剪
     *
     * @param requestCode
     * @param directory
     * @param imageUri
     * @param aspectX
     * @param aspectY
     * @param outputX
     * @param outputY
     */
    public void openCrop(int requestCode, String directory, Uri imageUri, int aspectX, int aspectY, int outputX, int outputY) {
        try {
            //设置裁剪之后的图片路径文件
            mCropFile = new File(Environment.getExternalStorageDirectory(), directory + System.currentTimeMillis() + ".jpg");
            if (!mCropFile.getParentFile().exists()) {
                mCropFile.getParentFile().mkdirs();
            }
            mCropFile.createNewFile(); //初始化

            Intent intent = new Intent("com.android.camera.action.CROP");
            if (Build.VERSION.SDK_INT >= 24) {
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            }
            mCropUri = Uri.fromFile(mCropFile); //把这个 uri 提供出去，就可以解析成 bitmap了
            // crop为true是设置在开启的intent中设置显示的view可以剪裁
            intent.putExtra("crop", true);
            // aspectX,aspectY 是宽高的比例，这里设置正方形
            intent.putExtra("aspectX", aspectX);
            intent.putExtra("aspectY", aspectY);
            //设置要裁剪的宽高
            intent.putExtra("outputX", outputX);
            intent.putExtra("outputY", outputY);
            intent.putExtra("scale", true);

            //如果图片过大，会导致oom，这里设置为false  如果设置true返回的就是bitmap
            intent.putExtra("return-data", false);
            //设置原数据
            if (imageUri != null) {
                intent.setDataAndType(imageUri, "image/*");
            }
            //图片输出路径
            if (mCropUri != null) {
                intent.putExtra(MediaStore.EXTRA_OUTPUT, mCropUri);
            }
            //自动识别人脸
            intent.putExtra("noFaceDetection", true);
            //压缩图片
            intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
            ((Activity) mContext).startActivityForResult(intent, requestCode);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取裁剪之后的图片文件
     *
     * @return
     */
    public File getCropFile() {
        return mCropFile;
    }

    /**
     * 获取原始图片文件
     *
     * @return
     */
    public File getOriginalFile() {
        return mOriginalFile;
    }

    /**
     * 获取拍照原始图片文件的Uri
     *
     * @return
     */
    public Uri getOriginalUri() {
        Uri pictureUri;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            pictureUri = FileProvider.getUriForFile(mContext, CodeConstant.PROVIDER_STR, mOriginalFile); // 通过FileProvider创建一个content类型的Uri
        } else {
            pictureUri = Uri.fromFile(mOriginalFile);
        }
        LogUtils.dNormal(TAG + "原始图片Uri==", pictureUri.toString());
        return pictureUri;
    }

    /**
     * 获取裁剪之后的Uri
     *
     * @return
     */
    public Uri getCropUri() {
        return mCropUri;
    }


    /**
     * 图片进行压缩
     *
     * @param inSampleSize 可以根据需求计算出合理的inSampleSize
     * @param originalFile 要压缩的文件
     * @param directory    压缩后图片输出文件夹目录
     * @return
     */
    public File compress(int inSampleSize, File originalFile, String directory) {
        //压缩后的文件
        File compressFile = new File(Environment.getExternalStorageDirectory(), directory + System.currentTimeMillis() + ".jpg");
        if (!compressFile.getParentFile().exists()) {
            compressFile.getParentFile().mkdirs();
        }
        BitmapFactory.Options options = new BitmapFactory.Options();
        //设置此参数是仅仅读取图片的宽高到options中，不会将整张图片读到内存中，防止oom
        options.inJustDecodeBounds = true;
        Bitmap emptyBitmap = BitmapFactory.decodeFile(originalFile.getAbsolutePath(), options);

        options.inJustDecodeBounds = false;
        options.inSampleSize = inSampleSize;
        Bitmap resultBitmap = BitmapFactory.decodeFile(originalFile.getAbsolutePath(), options);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        resultBitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
        try {
            FileOutputStream fos = new FileOutputStream(compressFile);
            fos.write(bos.toByteArray());
            fos.flush();
            fos.close();
            return compressFile;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
